// request.js
import axios from "axios";
import { useAccountStore } from "../stores/account";
import { apiConfig } from "./config";
import { ElMessageBox } from "element-plus";

let isShowAlert = false;
// 创建axios实例 - 使用配置管理器
const service = axios.create({
    baseURL: apiConfig.baseURL,
    timeout: apiConfig.timeout,
});

/**
 * 更新 axios 实例配置
 * 当配置管理器的配置更新时调用
 */
export function updateAxiosConfig() {
    service.defaults.baseURL = apiConfig.baseURL;
    service.defaults.timeout = apiConfig.timeout;

    // 设置自定义请求头
    if (apiConfig.headers) {
        Object.assign(service.defaults.headers, apiConfig.headers);
    }
}

// 请求拦截器
service.interceptors.request.use(
    (config) => {
        // 在发送请求之前做些什么，例如添加token
        const token = useAccountStore().token;
        if (token) {
            config.headers["Authorization"] = `Bearer ${token}`;
        }
        return config;
    },
    (error) => {
        // 对请求错误做些什么
        return Promise.reject(error);
    }
);

// 响应拦截器
service.interceptors.response.use(
    (response) => {
        // 对响应数据做点什么
        const { data } = response;
        switch (data.code) {
            case 401:
                useAccountStore().tokenAuthFail(data.message);
                break;
        }
        return data;
    },
    (error) => {
        // 对响应错误做点什么
        console.error("网络请求错误:", error);
        if (!isShowAlert) {
            isShowAlert = true;
            ElMessageBox.alert("<strong>请求域</strong>:" + error.config.baseURL + "<br />" + "<strong>地址</strong>:" + error.config.url, "网络错误", {
                confirmButtonText: "我知道了",
                type: "error",
                dangerouslyUseHTMLString: true,
            }).finally(() => {
                isShowAlert = false;
            });
        }
        return Promise.reject(error);
    }
);

// 封装get方法
function get(url, params = {}) {
    const config = {
        url,
        method: "get",
        params: { ...params },
    };
    return service(config);
}

// 封装post方法
function post(url, data = {}) {
    const config = {
        url,
        method: "post",
        data,
    };
    return service(config);
}

// 封装del方法
function del(url, data = {}) {
    const config = {
        url,
        method: "delete",
        data,
    };
    return service(config);
}

// 主要修复：导出service实例作为默认导出，同时保持原有的方法导出
export default service;

// 同时导出便捷方法
export { get, post, del, service };
